在製作網頁過程,會像圖示一樣,希望每個檔案程式量不超過兩百行,可能會拆解很多部分,一部分也會用模組化使用,拆解部分當作物件來使用並進行封裝,封裝內就會使用大量的 this。
var a = '全域';
function fn(b) {
console.log(this === window);
}
fn('a', 1, 2, 3);
var myName = '全域'
var obj = { // this 目前指向的位置
myName: '小明',
fn: function () {
console.log(this.myName);
}
}
obj.fn();
// 輸出結果 : 小明
var myName = '全域'
function fn() {
console.log(this, this.myName);
}
var obj = { // this 目前指向的位置
myName: '小明',
fn: fn
}
obj.fn();
// 輸出結果 : 小明
var myName = '全域'
function fn() {
console.log(this, this.myName);
}
var obj = {
myName: '小明',
inner: { // this 目前指向的位置
myName: '小明家',
fn: fn
}
}
obj.inner.fn()
// 輸出結果 : 小明家
var myName = '全域'
function fn() {
console.log(this, this.myName);
}
;(function(){ // 立即函式內也是看呼叫前方有無物件
fn() // 無物件回到最外層
})();
obj.inner.fn()
// 輸出結果 : 全域
;
--> 可搜尋 ASI JS
var myName = '全域'
function fn() {
console.log(this, this.myName);
}
var obj = {
myName: '小明',
inner: {
myName: '小明家',
fn1: function () {
fn() // 外層定義的 fn -> simple call -> 前無物件所以指向全域
}
}
}
obj.inner.fn1()
// 輸出結果 : 全域
var myName = '全域'
function fn() {
console.log(this, this.myName);
}
var obj = {
myName: '小明',
inner: { // this 目前指向的位置
myName: '小明家',
fn1: function () {
console.log(this, this.myName);
}
}
}
obj.inner.fn1()
// 輸出結果 : 小明家
```javascript
var myName = '全域'
function fn() {
console.log(this, this.myName);
}
var obj = {
myName: '小明',
inner: {
myName: '小明家',
fn1: function () {
setTimeout(function() { // callback -> simple call -> 前無物件所以指向全域
console.log(this, this.myName);
});
}
}
}
obj.inner.fn1()
// 輸出結果 : 全域
// 箭頭函式
var myName = '全域'
function fn() {
console.log(this, this.myName);
}
var obj = {
myName: '小明',
inner: {
myName: '小明家',
fn1: function () {
console.log(this, this.myName);
(() => { // 箭頭函式看目前作用域,跟著外層的
console.log(this, this.myName);
})();
}
}
}
obj.inner.fn1()
// 輸出結果 : 小明家 小明家
var myName = '全域'
function fn() {
console.log(this, this.myName);
}
var obj = {
myName: '小明',
inner: {
myName: '小明家',
fn1: function () {
console.log(this, this.myName); // 輸出結果 : 小明家
(function() {
console.log(this, this.myName); // 輸出結果 :全域
})();
}
}
}
obj.inner.fn1()
// 物件下需要使用 this,直接在最前面做定義,可用 vm
var obj = {
myName: '小明',
inner: {
myName: '小明家',
fn1: function () {
console.log(this, this.myName); // 輸出結果 : 小明家
var vm = this; // 物件下需要使用 this,直接在最前面做定義
(function() {
console.log(vm.myName); // 輸出結果 : 小明家
console.log(vm, this, vm === this);
console.log(obj === this, obj === vm)
})();
}
}
}
obj.inner.fn1()
// 輸出結果 : 小明家 小明家 兩者一致